-- 3x3 convolution filter

edge_duplicate=1;

function convolve_get_value (x,y, kernel, divisor, offset)
   local i, j, sum
   sum_r = 0   
   sum_g = 0   
   sum_b = 0   
   
   for i=-1,1 do
      for j=-1,1 do
         r,g,b = get_rgb (x+i, y+j)
         sum_r = sum_r + kernel[j+2][i+2] * r
         sum_g = sum_g + kernel[j+2][i+2] * g
         sum_b = sum_b + kernel[j+2][i+2] * b
      end
   end   
   return sum_r/divisor + offset, sum_g/divisor+offset, sum_b/divisor+offset
end

function convolve_value(kernel, divisor, offset)
for y=0, height-1 do
   for x=0, width-1 do      
       r,g,b = convolve_get_value (x,y, kernel, divisor, offset)
       set_rgb (x,y, r,g,b)
   end
   progress (y/height)
end
flush ()
end

function emboss()
    kernel = { { -2, -1,  0},
               { -1,  1,  1},
               {  0,  1,  2}}
    divisor = 1
    offset  = 0
    convolve_value(kernel, divisor, offset)
end

function sharpen()
    kernel = { { -1, -1, -1},
               { -1,  9, -1},
               { -1, -1, -1}}
    convolve_value(kernel, 1, 0)
end

function sobel_emboss()
    kernel = { { -1, -2, -1},
               {  0,  0,  0},
               {  1,  2,  1}}
    convolve_value(kernel, 1, 0.5)
end

function box_blur()
    kernel = { {  1,  1,  1},
               {  1,  1,  1},
               {  1,  1,  1}}
    convolve_value(kernel, 9, 0)
end

sharpen ()
